/**
在 Node.js 中，CommonJS 模块化系统允许开发者将代码组织成模块，以便于管理和复用。当涉及到链式引用模块时，可能会出现循环依赖的问题。以下是关于链式引用模块如何执行的总结说明。
一、CommonJS 模块概述
在 CommonJS 模块中，每个文件都是一个独立的模块。使用  `require()`  函数导入其他模块，并使用  `module.exports`  导出模块的内容。

二、链式引用模块
 1. 链式引用的定义
链式引用模块是指一个模块通过  `require()`  引入另一个模块，而被引入的模块又引用了第一个模块。这种情况可能导致循环依赖。

 2. 示例
假设有两个模块  `moduleA.js`  和  `moduleB.js` ，它们互相引用：

moduleA.js：
const moduleB = require('./moduleB');
console.log('moduleA:', moduleB);
module.exports = '这是模块 A';
moduleB.js：
const moduleA = require('./moduleA');
console.log('moduleB:', moduleA);
module.exports = '这是模块 B';
 3. 执行过程
当 Node.js 执行  `moduleA.js`  时，执行流程如下：

1. 加载  `moduleA` ：
   - Node.js 开始执行  `moduleA.js` ，遇到  `require('./moduleB')` ，开始加载  `moduleB.js` 。
2. 加载  `moduleB` ：
   - 在  `moduleB.js`  中，遇到  `require('./moduleA')` ，此时 Node.js 检查  `moduleA`  是否已经加载。
   - 由于  `moduleA`  还在加载中，Node.js 会返回一个“未完成”的模块对象（即  `module.exports`  为空对象）。
3. 返回到  `moduleB` ：
   -  `moduleB.js`  中的  `console.log('moduleB:', moduleA);`  输出  `moduleA: {}` ，因为  `moduleA`  还未完全加载。
4. 完成  `moduleB`  的加载：
   -  `moduleB`  的  `module.exports`  被设置为  `'这是模块 B'` ，然后返回到  `moduleA` 。
5. 继续执行  `moduleA` ：
   - 回到  `moduleA.js` ， `console.log('moduleA:', moduleB);`  输出  `moduleB: '这是模块 B'` ，因为此时  `moduleB`  已经完成加载。
   - 最后， `moduleA`  的  `module.exports`  被设置为  `'这是模块 A'` 。
 4. 循环依赖的结果

- 在这种链式引用中，最终的结果是两个模块都能正常加载，但它们的导出在加载时可能是未定义的，具体取决于加载顺序。
- 如果一个模块在另一个模块的加载过程中引用了它，得到的将是一个空对象或未定义的值。

三、总结
1. 链式引用：指模块之间互相引用的情况，可能导致循环依赖。
2. 执行顺序：Node.js 在加载模块时会记录已加载的模块，避免重复加载。
3. 未完成模块：在循环依赖的情况下，返回的模块对象可能不包含完整的导出内容。
4. 设计考虑：在设计模块时，尽量避免循环依赖，或者通过重构代码来消除这种情况，以提高代码的可维护性和可读性。
 */

// 1.结论一: 当一个模块被引入(导入), 模块中的代码会被执行一次
// console.log("--------")
// const foo = require("./06_foo")
// console.log("++++++++")

// 2.结论二: 当一个模块被多次引入时, 模块中的代码只会执行一次
// const foo1 = require("./06_foo")
// const foo2 = require("./06_foo")
// const foo3 = require("./06_foo")
// const foo4 = require("./06_foo")
// const foo5 = require("./06_foo")
// const foo6 = require("./06_foo")

// 3.结论三: 当一个模块被多次引入时, 模块中的代码只会执行一次, 并且会返回同一个module.exports对象
// 如果有循环引入, 那么执行顺序: 深度优先算法(图结构)
// 数组结构/链表结构/树结构
console.log("main")
require("./01_aaa")
require("./02_bbb")
